﻿#define _CRT_SECURE_NO_WARNINGS 1


//数组  --  ⼀组相同类型元素的集合
//• 数组中存放的是1个或者多个数据，但是数组元素个数不能为0。
//• 数组中存放的多个数据，类型是相同的。



////⼀维数组的创建和初始化
//
//#include<stdio.h>
//
//int main()
//{
//	int arr1[5] = { 1,2,3,4,5, };//完全初始化
//	int arr2[20] = { 1,2,3,4 };//未完全初始化 -- 剩余的数据全部给0
//
//	return 0;
//}

//#include<stdio.h>
//
//int main()
//{
//	int arr[10]; //int 是数组元素的类型
//	//数组arr 的类型是 int [10]
//
//	return 0;
//}


//#include<stdio.h>
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("%d\n", arr[6]);//[] 下标引用操作符
//
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//
//
//	return 0;
//}


//#include<stdio.h>
//
//int main()
//{
//	int arr[10] = {0};//初始化
//	//输入
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//
//	//输出
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//
//	return 0;
//}


//int main()
//{
//	int arr1[10] = { 0 };
//	int arr2[10] = { 1,2,3,4,5 };
//	int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr4[] = { 0 };//这个数组几个元素？
//
//	return 0;
//}


////%p 是专门用来打印地址的
////特点：16进制的形式打印，同时最前面的0不会省略
////%x 是16进制的形式打印
////数组在内存中是连续存放的
//#include<stdio.h>
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("&arr[%d] = %p\n", i, &arr[i]);
//	}
//
//	return 0;
//}


//strlen - 求字符串长度的，只能针对字符串


//#include<stdio.h>
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5 };
//	printf("%d\n", sizeof(arr));//sizeof(数组名)  计算整个数组的大小单位是字节
//	printf("%d\n", sizeof(int [10]));
//
//	printf("%d\n", sizeof(arr[0]));//一个元素占据空间的大小，单位是字节
//	printf("%d\n", sizeof(int));
//
//	return 0;
//}


//#include<stdio.h>
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//
//	int size = sizeof(arr) / sizeof(arr[0]);//计算数组个数
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//
//	return 0;
//}


//⼆维数组



//#include<stdio.h>
//
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };//完全初始化
//	int arr1[3][5] = { 1,2,3 };//未完全初始化，剩余的默认给0
//	int arr2[3][5] = { {1,2},{3,4,5 }, { 6,7 } };
//	int arr3[][5] = {1,2,3};//初始化时省略⾏，但是不能省略列
//
//	return 0;
//}



////⼆维数组的⾏是从0开始的，列也是从0开始的
//#include<stdio.h>
//
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
//	printf("%d\n", arr[2][4]);
//
//	return 0;
//}

////⼆维数组的输⼊和输出
//#include<stdio.h>
//
//int main()
//{
//	int arr[3][5] = { 0 };
//	int i = 0;
//	int j = 0;
//	//输入
//	for (i = 0; i < 3; i++)
//	{
//		
//		for (j = 0; j < 5; j++)
//		{
//			scanf("%d", &arr[i][j]);
//		}
//	}
//	//输出
//	for (i = 0; i < 3; i++)
//	{
//
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//
//	return 0;
//}


////⼆维数组在内存中的存储 --- ⼆维数组中的每个元素都是连续存放
//#include<stdio.h>
//
//int main()
//{
//	int arr[3][5] = { 0 };
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("&arr[%d][%d] = %#p\n", i, j, &arr[i][j]);
//		}
//	}
//	return 0;
//}


////数组练习
////练习1：多个字符从两端移动，向中间汇聚
//#include<stdio.h>
//#include<string.h>
//#include<windows.h>
//
//int main()
//{
//	char arr1[] = "wellcome to China!";
//	char arr2[] = "##################";
//
//	int left = 0;
//	int right = strlen(arr2) - 1;
//	printf("%s\n", arr2);
//
//	while (left <= right)
//	{
//		Sleep(1000);
//		system("cls");
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		printf("%s\n", arr2);
//		left++;
//		right--;
//	}
//
//	return 0;
//}


////题目：
////在一个有序的数组中查找指定的数，是否存在，存在则打印下标，不存在则说明不存在！
//#include<stdio.h>
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int key = 0;
//	scanf("%d", &key);
//	int size = sizeof(arr) / sizeof(int);
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		if (arr[i] == key)
//		{
//			printf("找到了，下标是:%d\n", i);
//			break;
//		}
//	}
//	if (size == i)
//		printf("没找到!\n");
//
//
//	return 0;
//}


//练习2：⼆分查找
#include<stdio.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int key = 0;
	scanf("%d", &key);

	int size = sizeof(arr) / sizeof(int);

	int left = 0, right = size - 1;

	while (left <= right)
	{
		int mid = (left + right) / 2;

		if (arr[mid] < key)
			left = mid + 1;
		else if (arr[mid] > key)
			right = mid - 1;
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}
	}
	if (left > right)
		printf("找不到!\n");


	return 0;
}